// ================= 高阶函数 ======================= //
/**
 *  1. 一个函数的参数是函数, 我们称之为高阶函数.
 *  2. 一个函数的返回值是 函数. 我们也称之为高阶函数
 */

function coreFn(a, b, c) {
  // 实现了核心逻辑

  console.log("core fn", a, b, c);
}

// 如果希望扩展公共的方法,  通过原型链扩展的属性是公共的
Function.prototype.before = function (beforeFn) {
  // console.log("beforeFn ---->>", beforeFn, this); // 这里的this指的就是 coreFn
  return (...args) => { // newFn 箭头函数没有this, 没有arguments, 没有原型
    // 把所有的参数收集成一个数组
    // console.log(args);
    beforeFn();
    this(...args) // 展开传递给coreFn
  }
}

let newFn = coreFn.before(() => {
  console.log("before fn");
})

newFn(1, 2, 3); // 'before fn' 'core fn'

// ---------------- 函数的柯理化 ---------------- //
